# _*_coding=utf-8 _*_
"""
名称：mission_02_server
版本：v1.1
改进：当客户端关闭是优雅的显示退出信息，同时不能影响另外的客户端传文件。
功能：
服务端，不使用开源框架，基于 TCP 协议改造 echo 服务端和客户端代码，实现服务端接收客户端传输单个文件的功能。允许3个客户端同时连接。
时间：2020-12-04
作者：长毛怪^^
"""
from datetime import datetime
import socket
import threading
import os

s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
ip_addr = '127.0.0.1'  # 当前服务器的IP地址
port = 8888  # 这里是端口
s.bind((ip_addr, port))  # 这里要输入一个元祖
s.listen(3)
print(f'服务器启动，正在聆听你的声音……服务器端IP：{ip_addr}')


# 两个函数，一个负责和客户端建立连接，一个负责创建多线程
def cli_conn(client, addr):  # 负责和客户端建立连接
    print(f'有客户端接入，接入地址为：{addr}')
    client.send('这是一条来自服务器的消息：服务器连接成功……'.encode('utf-8'))

    time_s = str(datetime.today())
    path = os.getcwd() + f"/server_get/{time_s[:10]}/"
    if not os.path.exists(path):  # 如果路径不存在就创建路径
        os.makedirs(path)
    content = []
    try:
        while True:
            recvmsg = client.recv(1024)
            content.append(recvmsg)
            if b'' in content:
                break

        file_name = content[0].decode('utf-8')
        with open(path+f'{file_name}', 'wb') as f:
            for i in range(1, len(content)):
                f.write(content[i])
            print("文件保存完毕!")

    except ConnectionResetError:
        print(f'{addr}退出！')


def thr_cont():  # 负责创建多线程
    global s
    while True:
        connection, address = s.accept()
        c_thread = threading.Thread(target=cli_conn, args=(connection, address))
        c_thread.start()


if __name__ == '__main__':
    thr_cont()
